package com.xiaolin.common.utils;

import org.springframework.lang.Nullable;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @ClassName HttpUtils
 * @Description TODO
 * @Detail 使用java原生代码实现http请求
 * @Author MyPC
 * @Date 2020/9/30
 * @Version 1.0
 */
public class HttpUtils {
    /**
     * 使用原生java代码实现GET请求:
     *      步骤：
             1、创建远程连接
             2、设置连接方式（get、post、put。。。）
             3、设置连接超时时间
             4、设置响应读取超时时间
             5、发起请求（建立连接）
             6、获取响应数据
             7、关闭连接
     */
    public static String doGet(String httpUrl){

        HttpURLConnection connection=null;
        InputStream inputStream=null;
        BufferedReader reader =null;
        StringBuffer result=new StringBuffer();
        try {
            //1.创建链接
            URL url = new URL(httpUrl);
            connection= (HttpURLConnection) url.openConnection();
            //2、设置请求方式
            connection.setRequestMethod("GET");
            //3、设置连接超时时间，以毫秒为单位
            connection.setConnectTimeout(1000*15);
            //4、设置响应读取超时时间
            connection.setReadTimeout(1000*15);
            //5、开始连接
            connection.connect();
            //6、获取请求数据
            if(connection.getResponseCode() == 200){
                //响应200代表成功
                inputStream = connection.getInputStream();
                if(inputStream !=null){
                    reader=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
                    String temp=null;
                    while ((temp=reader.readLine()) != null){
                        result=result.append(temp);
                    }
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(reader !=null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(inputStream !=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                connection.disconnect();
            }
        }
        return result.toString();

    }

    /**
     *
     *  使用原生java代码实现POST请求:
            创建步骤：
             1、创建远程连接
             2、设置连接方式（get、post、put。。。）
             3、设置连接超时时间
             4、设置响应读取时间
             5、当向远程服务器传送数据/写数据时，需要设置为true（setDoOutput）
             6、当前向远程服务读取数据时，设置为true，该参数可有可无（setDoInput）
             7、设置传入参数的格式:（setRequestProperty）
             8、设置鉴权信息：Authorization:（setRequestProperty）
             9、设置参数
             10、发起请求
             11、获取请求数据
             12、关闭连接
     */
    public static String dopost(String httpUrl, @Nullable String params){
        HttpURLConnection connection=null;
        InputStream inputStream=null;
        OutputStream outputStream=null;
        BufferedReader reader=null;
        StringBuffer result=new StringBuffer();
        try {
            //1、创建连接
            URL url=new URL(httpUrl);
            connection= (HttpURLConnection) url.openConnection();
            //2、设置请求方式
            connection.setRequestMethod("POST");
            //3、设置连接超时时间
            connection.setConnectTimeout(1000*15);
            //4、设置响应读取超时时间
            connection.setReadTimeout(1000*15);
            //5、设置传给服务器的数据是否可读取，需要设置为true（setDoOutput）
            connection.setDoOutput(true);
            //6、设置响应数据是否可读取，该参数可有可无（setDoInput）
            connection.setDoInput(true);
            //7、设置传入参数的格式
            // 设置为Json格式（application/json），也可以设置为application/x-www-form-urlencoded格式
            connection.setRequestProperty("Content-Type", "application/json");
            //8、设置鉴权信息，有权限认证时使用
            //9、设置参数
            if(params!=null && !params.equals("")){
                outputStream = connection.getOutputStream();
                //拼装参数
                outputStream.write(params.getBytes("utf-8"));
            }
            //10、开启连接
            connection.connect();
            //11、获取响应数据
            if(connection.getResponseCode() == 200){
                //响应200代表成功
                inputStream = connection.getInputStream();
                if(inputStream !=null){
                    reader=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
                    String temp=null;
                    while ((temp=reader.readLine()) != null){
                        result=result.append(temp);
                    }
                }
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(reader !=null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(inputStream!=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                connection.disconnect();
            }
        }
        return result.toString();
    }


}
